﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AudiPyme.DAL
{
    public class InstanciaTipactAmenCritriesgInformeFactory
    {
        //Método que saca las instancias Tipo Activo - Amenaza - Criterio Riesgo actuales de una empresa y los inserta en su tabla de Informe
        public static bool InsertaInstTipactAmenCritriesg(int IdEmpresa, int IdInforme)
        {
            try
            {
                //Valor de la ejecucion si todo va bien
                bool ok = true;
                ModeloContainer agenteBD = new ModeloContainer();
                List<InstanciaTiposActivosAmenazasCriteriosRiesgo> InstTACEmp = (from ITACE in agenteBD.InstanciaTiposActivosAmenazasCriteriosRiesgoEstablecer
                                                                                 where ITACE.IdEmpresa == IdEmpresa && ITACE.Actual == true
                                                                                 select ITACE).ToList();
                if (InstTACEmp.Count == 0)
                {
                    //No se recogieron controles se devuelve un valor de error
                    ok = false;
                    return ok;
                }
                else
                {
                    foreach (InstanciaTiposActivosAmenazasCriteriosRiesgo Instancia in InstTACEmp)
                    {
                        InstanciaTipactAmenCritriesgInforme nuevaInstancia = new InstanciaTipactAmenCritriesgInforme();
                        nuevaInstancia.IdInforme = IdInforme;
                        nuevaInstancia.IdEmpresa = Instancia.IdEmpresa;
                        nuevaInstancia.IdTipoActivo = Instancia.IdTipoActivo;
                        nuevaInstancia.IdAmenaza = Instancia.IdAmenaza;
                        nuevaInstancia.IdCriterioRiesgo = Instancia.IdCriterioRiesgo;
                        agenteBD.AddToInstanciaTipactAmenCritriesgInformeEstablecer(nuevaInstancia);
                    }
                    agenteBD.SaveChanges();
                    return ok;
                }
            }
            catch (Exception e)
            {
                e.ToString();
                return false;
            }
        }

        //Método que recoge el número de Relaciones Tipo Activo - Amenaza - Criterio de riesgo de un informe asociado a una Empresa
        public static int NumRelacTipAmenCritInforme(int IdInforme)
        {

            ModeloContainer agenteBD = new ModeloContainer();
            int nRelac = (from InstTipAmenCrit in agenteBD.InstanciaTipactAmenCritriesgInformeEstablecer
                          where InstTipAmenCrit.IdInforme == IdInforme
                          select InstTipAmenCrit).Count();
            return nRelac;
        }

        //Método que recoge el número de Relaciones Tipo Activo - Amenaza - Criterio de riesgo de un informe por Tipo de Activo
        public static int NumRelacTipAmenCritInformePorTipoActivo(int IdInforme, int IdTipoActivo)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            int NumRelaciones = (from Rel in agenteBD.InstanciaTipactAmenCritriesgInformeEstablecer
                                 where Rel.IdInforme == IdInforme && Rel.IdTipoActivo == IdTipoActivo
                                 select Rel).Count();
            return NumRelaciones;
        }

        //Método que elimina de forma permanente, todos las relaciones de informe Tipo Activo - Amenaza - Criterio
        //asociados a una empresa
        internal static void EliminaTotalInstanciasTipAmenCrit(int IdEmpresa)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<InstanciaTipactAmenCritriesgInforme> InstanciasEliminarQuery = from AnaRies in agenteBD.InstanciaTipactAmenCritriesgInformeEstablecer
                                                                                      join EmpInf in agenteBD.EmpresaInformeEstablecer on AnaRies.IdInforme equals EmpInf.IdInforme
                                                                                      where EmpInf.IdEmpresa == IdEmpresa
                                                                                      select AnaRies;
            if (InstanciasEliminarQuery.Count() != 0)
            {
                foreach (InstanciaTipactAmenCritriesgInforme Instancia in InstanciasEliminarQuery)
                {
                    agenteBD.InstanciaTipactAmenCritriesgInformeEstablecer.DeleteObject(Instancia);
                }
                agenteBD.SaveChanges();
            }
        }

        //Método que elimina de forma permanente, todos las relaciones de informe Tipo Activo - Amenaza - Criterio
        //asociados a un informe
        internal static void EliminaInstanciasTipAmenCritInforme(int IdInforme)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<InstanciaTipactAmenCritriesgInforme> InstanciasEliminarQuery = from Instancia in agenteBD.InstanciaTipactAmenCritriesgInformeEstablecer
                                                                                      where Instancia.IdInforme == IdInforme
                                                                                      select Instancia;
            if (InstanciasEliminarQuery.Count() != 0)
            {
                foreach (InstanciaTipactAmenCritriesgInforme Instancia in InstanciasEliminarQuery)
                {
                    agenteBD.InstanciaTipactAmenCritriesgInformeEstablecer.DeleteObject(Instancia);
                }
                agenteBD.SaveChanges();
            }
        }

        //Método que elimina de forma permanente, todos las relaciones de informe Tipo Activo - Amenaza - Criterio
        //asociados a una lista de informes
        internal static void EliminaInstanciasTipAmenCritInformes(List<int> LInformes)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<InstanciaTipactAmenCritriesgInforme> InstanciasEliminarQuery = from Instancia in agenteBD.InstanciaTipactAmenCritriesgInformeEstablecer
                                                                                      where LInformes.Contains(Instancia.IdInforme)
                                                                                      select Instancia;
            if (InstanciasEliminarQuery.Count() != 0)
            {
                foreach (InstanciaTipactAmenCritriesgInforme Instancia in InstanciasEliminarQuery)
                {
                    agenteBD.InstanciaTipactAmenCritriesgInformeEstablecer.DeleteObject(Instancia);
                }
                agenteBD.SaveChanges();
            }
        }
    }
}
